package com.mallbook.model.service;

import com.mallbook.model.exception.ServiceException;
import com.mallbook.model.pojo.Category;
import com.mallbook.model.pojo.Goods;
import com.mallbook.model.pojo.PageBean;
import com.mallbook.model.mapper.GoodsMapper;
import com.mallbook.model.utils.MybatisUtils;
import org.apache.ibatis.exceptions.PersistenceException;

import java.math.BigDecimal;
import java.util.List;

/**
 * @Author 宋明松
 * @Version V1.0.0
 * @Date 2022-06-25
 * 商品service层
 */
public class GoodsService {

    /**
     * 添加商品
     *
     * @param name         书籍名称
     * @param author       作者
     * @param press        出版社
     * @param pressTime    出版时间
     * @param bookNum      商品编号
     * @param stock        库存
     * @param marketPrice  市场价格
     * @param sellingPrice 销售价格
     * @param describes    产品描述
     * @param isNew        是否最新 1代表最新，-1代表不为最新（默认为1）
     * @param isHot        是否热卖 1代表热卖，-1代表不为热卖（默认为1）
     * @param img          缩略图
     * @param categoryID   类别
     * @param salesNum     销量
     */
    public void addGoods(String name,
                         String author,
                         String press,
                         String pressTime,
                         String bookNum,
                         Integer stock,
                         String marketPrice,
                         String sellingPrice,
                         String describes,
                         Integer isNew,
                         Integer isHot,
                         String img,
                         Integer categoryID,
                         Integer salesNum) {
        GoodsMapper goodsMapper = MybatisUtils.getMappers(GoodsMapper.class);
        Goods goods = new Goods();
        goods.setBookName(name);
        goods.setAuthor(author);
        goods.setPress(press);
        goods.setPressTime(pressTime);
        goods.setBookNum(bookNum);
        goods.setStock(stock);
        goods.setMarketPrice(new BigDecimal(marketPrice));
        goods.setSellingPrice(new BigDecimal(sellingPrice));
        goods.setDescribes(describes);
        goods.setIsNew(isNew);
        goods.setIsHot(isHot);
        goods.setImg(img);
        Category category = new Category();
        category.setId(categoryID);
        goods.setCategory(category);
        goods.setSalesNum(salesNum);
        goods.setState(1);
        // 如果名称和编号相同只增加数量
        Goods g = new Goods();
        g.setBookName(goods.getBookName());
        g.setBookNum(goods.getBookNum());
        try {
            List<Goods> goodsList = goodsMapper.findGoodsByCondition(g);
            // 数据库中存在相同商品，增加商品库存
            if (goodsList.size() != 0) {
                Goods resultGoods = goodsList.get(0);
                Goods gs = new Goods();
                // 增加数量
                gs.setStock(resultGoods.getStock() + goods.getStock());
                goodsMapper.update(gs, resultGoods.getId());
            } else {
                goodsMapper.add(goods);
            }
        } catch (
                PersistenceException e) {
            throw new ServiceException("数据操作异常", e);
        }
    }

    /**
     * 删除商品(逻辑删除）
     *
     * @param id 商品ID
     */
    public void delGoods(Integer id) {
        GoodsMapper goodsMapper = MybatisUtils.getMappers(GoodsMapper.class);
        Goods goods = new Goods();
        goods.setState(-1);
        try {
            goodsMapper.update(goods, id);
        } catch (
                PersistenceException e) {
            throw new ServiceException("数据操作异常", e);
        }
    }

    /**
     * 批量删除商品(逻辑删除）
     *
     * @param ids 商品ID的集合
     */
    public void delGoodsMore(List<Integer> ids) {
        GoodsMapper goodsMapper = MybatisUtils.getMappers(GoodsMapper.class);
        Goods goods = new Goods();
        goods.setState(-1);
        try {
            goodsMapper.updateMore(ids, goods);
        } catch (
                PersistenceException e) {
            throw new ServiceException("数据操作异常", e);
        }
    }

    /**
     * 修改（除名称和isbn都能该）
     *
     * @param author       作者
     * @param press        出版社
     * @param pressTime    出版时间
     * @param stock        库存
     * @param marketPrice  市场价格
     * @param sellingPrice 销售价格
     * @param describes    产品描述
     * @param isNew        是否最新 1代表最新，-1代表不为最新（默认为1）
     * @param isHot        是否热卖 1代表热卖，-1代表不为热卖（默认为1）
     * @param img          缩略图
     * @param categoryID   类别
     * @param salesNum     销量
     * @param state        状态 代表删除-1，1代表不删除，默认为1
     * @param gid          商品ID
     */
    public void updateGoods(String author,
                            String press,
                            String pressTime,
                            Integer stock,
                            String marketPrice,
                            String sellingPrice,
                            String describes,
                            Integer isNew,
                            Integer isHot,
                            String img,
                            Integer categoryID,
                            Integer salesNum,
                            Integer state,
                            Integer gid) {
        GoodsMapper goodsMapper = MybatisUtils.getMappers(GoodsMapper.class);
        Goods goods = new Goods();
        goods.setAuthor(author);
        goods.setPress(press);
        goods.setPressTime(pressTime);
        goods.setStock(stock);
        goods.setMarketPrice(new BigDecimal(marketPrice));
        goods.setSellingPrice(new BigDecimal(sellingPrice));
        goods.setDescribes(describes);
        goods.setIsNew(isNew);
        goods.setIsHot(isHot);
        goods.setImg(img);
        goods.setId(gid);
        Category category = new Category();
        category.setId(categoryID);
        goods.setCategory(category);
        goods.setSalesNum(salesNum);
        goods.setState(state);
        try {
            goodsMapper.update(goods, goods.getId());
        } catch (
                PersistenceException e) {
            throw new ServiceException("数据操作异常", e);
        }
    }

    /**
     * 修改（除名称和isbn都能该）
     *
     * @param ids          需要修改的商品ID的集合
     * @param author       作者
     * @param press        出版社
     * @param pressTime    出版时间
     * @param stock        库存
     * @param marketPrice  市场价格
     * @param sellingPrice 销售价格
     * @param describes    产品描述
     * @param isNew        是否最新 1代表最新，-1代表不为最新（默认为1）
     * @param isHot        是否热卖 1代表热卖，-1代表不为热卖（默认为1）
     * @param img          缩略图
     * @param categoryID   类别
     * @param salesNum     销量
     * @param state        状态 代表删除-1，1代表不删除，默认为1
     */
    public void updateGoodsMore(List<Integer> ids,
                                String author,
                                String press,
                                String pressTime,
                                Integer stock,
                                String marketPrice,
                                String sellingPrice,
                                String describes,
                                Integer isNew,
                                Integer isHot,
                                String img,
                                Integer categoryID,
                                Integer salesNum,
                                Integer state) {
        GoodsMapper goodsMapper = MybatisUtils.getMappers(GoodsMapper.class);
        Goods goods = new Goods();
        goods.setAuthor(author);
        goods.setPress(press);
        goods.setPressTime(pressTime);
        goods.setStock(stock);
        goods.setMarketPrice(new BigDecimal(marketPrice));
        goods.setSellingPrice(new BigDecimal(sellingPrice));
        goods.setDescribes(describes);
        goods.setIsNew(isNew);
        goods.setIsHot(isHot);
        goods.setImg(img);
        Category category = new Category();
        category.setId(categoryID);
        goods.setCategory(category);
        goods.setSalesNum(salesNum);
        goods.setState(state);
        try {
            goodsMapper.updateMore(ids, goods);
        } catch (
                PersistenceException e) {
            throw new ServiceException("数据操作异常", e);
        }
    }

    /**
     * 查询所有商品 分页查询
     *
     * @return
     */
    public PageBean<Goods> getAllGoods(Integer pageNum) {

        return PageBeanGoods.getByPage(null, pageNum);
    }

    /**
     * 通过ID查询商品
     *
     * @param id 商品ID
     * @return
     */
    public Goods getGoodsById(Integer id) {
        GoodsMapper goodsMapper = MybatisUtils.getMappers(GoodsMapper.class);
        try {
            return goodsMapper.findGoodsById(id);
        } catch (
                PersistenceException e) {
            throw new ServiceException("数据操作异常", e);
        }
    }

    /**
     * 多条件查询
     *
     * @param goods 查询条件
     * @return
     */
    public PageBean<Goods> getGoodsByCondition(Goods goods, Integer pageNum) {
        return PageBeanGoods.getByPage(goods, pageNum);
    }

    /**
     * 查询热卖商品
     *
     * @param size 需要查询的商品条数
     * @return
     */
    public List<Goods> getHotGoods(Integer size) {
        GoodsMapper goodsMapper = MybatisUtils.getMappers(GoodsMapper.class);
        try {
            return goodsMapper.findHotGoods(size);
        } catch (
                PersistenceException e) {
            throw new ServiceException("数据操作异常", e);
        }
    }

    /**
     * 查询最新商品
     *
     * @param size 需要查询的商品条数
     * @return
     */
    public List<Goods> getNewGoods(Integer size) {
        GoodsMapper goodsMapper = MybatisUtils.getMappers(GoodsMapper.class);
        try {
            return goodsMapper.findNewGoods(size);
        } catch (
                PersistenceException e) {
            throw new ServiceException("数据操作异常", e);
        }
    }

    /**
     * 通过类别查询商品
     *
     * @param cid 类别ID
     * @return
     */
    public List<Goods> getALLGoodsByCid(String cid) {
        GoodsMapper goodsMapper = MybatisUtils.getMappers(GoodsMapper.class);
        try {
            return goodsMapper.findALLGoodsByCid(cid);
        } catch (
                PersistenceException e) {
            throw new ServiceException("数据操作异常", e);
        }
    }
}
